package tech.powerjob.server.web.response;

import tech.powerjob.common.OmsConstant;
import tech.powerjob.server.persistence.remote.model.InstanceInfoDO;
import lombok.Data;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.beans.BeanUtils;

/**
 * InstanceInfo 对外展示对象
 *
 * @author tjq
 * @since 2020/4/12
 */
@Data
public class InstanceInfoVO {

	/**
	 * 任务ID（JS精度丢失）
	 */
	private String jobId;

	/**
	 * 任务名称
	 */
	private String jobName;

	/**
	 * 任务实例ID（JS精度丢失）
	 */
	private String instanceId;

	/**
	 * 该任务实例所属的 workflow ID，仅 workflow 任务存在
	 */
	private String wfInstanceId;

	/**
	 * 执行结果
	 */
	private String result;

	/**
	 * TaskTracker地址
	 */
	private String taskTrackerAddress;

	/**
	 * 总共执行的次数（用于重试判断）
	 */
	private Long runningTimes;

	private int status;

	/* ********** 不一致区域 ********** */
	/**
	 * 实际触发时间（需要格式化为人看得懂的时间）
	 */
	private String actualTriggerTime;

	/**
	 * 结束时间（同理，需要格式化）
	 */
	private String finishedTime;

	public static InstanceInfoVO from(InstanceInfoDO instanceInfoDo, String jobName) {
		InstanceInfoVO instanceInfoVO = new InstanceInfoVO();
		BeanUtils.copyProperties(instanceInfoDo, instanceInfoVO);

		// 额外设置任务名称，提高可读性
		instanceInfoVO.setJobName(jobName);

		// ID 转化为 String（JS精度丢失）
		instanceInfoVO.setJobId(instanceInfoDo.getJobId().toString());
		instanceInfoVO.setInstanceId(instanceInfoDo.getInstanceId().toString());
		if (instanceInfoDo.getWfInstanceId() == null) {
			instanceInfoVO.setWfInstanceId(OmsConstant.NONE);
		}
		else {
			instanceInfoVO.setWfInstanceId(String.valueOf(instanceInfoDo.getWfInstanceId()));
		}

		// 格式化时间
		if (instanceInfoDo.getActualTriggerTime() == null) {
			instanceInfoVO.setActualTriggerTime(OmsConstant.NONE);
		}
		else {
			instanceInfoVO.setActualTriggerTime(
					DateFormatUtils.format(instanceInfoDo.getActualTriggerTime(), OmsConstant.TIME_PATTERN));
		}
		if (instanceInfoDo.getFinishedTime() == null) {
			instanceInfoVO.setFinishedTime(OmsConstant.NONE);
		}
		else {
			instanceInfoVO.setFinishedTime(
					DateFormatUtils.format(instanceInfoDo.getFinishedTime(), OmsConstant.TIME_PATTERN));
		}

		return instanceInfoVO;
	}

}
